<!DOCTYPE html>



  


<html class="theme-next gemini use-motion" lang="zh-Hans">
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#222">
<script>
    (function () {
        if ('') {
            if (prompt('请输入文章密码') !== '') {
                alert('密码错误！');
                if (history.length === 1) {
                    location.replace("https://google.com"); // 这里替换成你的首页
                } else {
                    history.back();
                }
            }
        }
    })();
</script>








<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">







<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">

<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="mysql,">










<meta name="description" content="本文来自learnku 数据命名规范所有数据库对象名称必须使用小写字母并用下划线分割。 所有数据库对象名称禁止使用 MySQL 保留关键字（如果表名中包含关键字查询时，需要将其用单引号括起来）。 数据库对象的命名要能做到见名识意，并且最后不要超过32个字符。临时库表必须以 tmp_ 为前缀并以日期为后缀，备份表必须以 bak_ 为前缀并以日期 ( 时间戳 ) 为后缀。 所有存储相同数据的列名和列类">
<meta name="keywords" content="mysql">
<meta property="og:type" content="article">
<meta property="og:title" content="mysql开发规范">
<meta property="og:url" content="http://yoursite.com/2019/03/07/mysql开发规范/index.html">
<meta property="og:site_name" content="苏生不惑的博客">
<meta property="og:description" content="本文来自learnku 数据命名规范所有数据库对象名称必须使用小写字母并用下划线分割。 所有数据库对象名称禁止使用 MySQL 保留关键字（如果表名中包含关键字查询时，需要将其用单引号括起来）。 数据库对象的命名要能做到见名识意，并且最后不要超过32个字符。临时库表必须以 tmp_ 为前缀并以日期为后缀，备份表必须以 bak_ 为前缀并以日期 ( 时间戳 ) 为后缀。 所有存储相同数据的列名和列类">
<meta property="og:locale" content="zh-Hans">
<meta property="og:updated_time" content="2019-10-11T09:26:57.249Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="mysql开发规范">
<meta name="twitter:description" content="本文来自learnku 数据命名规范所有数据库对象名称必须使用小写字母并用下划线分割。 所有数据库对象名称禁止使用 MySQL 保留关键字（如果表名中包含关键字查询时，需要将其用单引号括起来）。 数据库对象的命名要能做到见名识意，并且最后不要超过32个字符。临时库表必须以 tmp_ 为前缀并以日期为后缀，备份表必须以 bak_ 为前缀并以日期 ( 时间戳 ) 为后缀。 所有存储相同数据的列名和列类">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://yoursite.com/2019/03/07/mysql开发规范/">



<meta name="referrer" content="never"> ​​​​


  <title>mysql开发规范 | 苏生不惑的博客</title>
  








</head>

<body itemscope="" itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope="" itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">苏生不惑的博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br>
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br>
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
            
            归档
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br>
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope="" itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/2019/03/07/mysql开发规范/">

    <span hidden itemprop="author" itemscope="" itemtype="http://schema.org/Person">
      <meta itemprop="name" content="苏生不惑">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope="" itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="苏生不惑的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">mysql开发规范</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-03-07T20:20:46+08:00">
                2019-03-07
              </time>
            

            

            
          </span>

          

          
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="page-pv"><i class="fa fa-file-o"></i>
            <span class="busuanzi-value" id="busuanzi_value_page_pv"></span>次
            </span>
          

          
            <div class="post-wordcount">
              
                
                  <span class="post-meta-divider">|</span>
                
                <span class="post-meta-item-icon">
                  <i class="fa fa-file-word-o"></i>
                </span>
                
                  <span class="post-meta-item-text">字数统计&#58;</span>
                
                <span title="字数统计">
                  5.3k 字
                </span>
              

              
                <span class="post-meta-divider">|</span>
              

              
                <span class="post-meta-item-icon">
                  <i class="fa fa-clock-o"></i>
                </span>
                
                  <span class="post-meta-item-text">阅读时长 &asymp;</span>
                
                <span title="阅读时长">
                  19 分钟
                </span>
              
            </div>
          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p><a href="https://learnku.com/articles/25020#topnav" target="_blank" rel="noopener">本文来自learnku</a></p>
<h3 id="数据命名规范"><a href="#数据命名规范" class="headerlink" title="数据命名规范"></a>数据命名规范</h3><p>所有数据库对象名称必须使用小写字母并用下划线分割。<br> 所有数据库对象名称禁止使用 MySQL 保留关键字（如果表名中包含关键字查询时，需要将其用单引号括起来）。<br> 数据库对象的命名要能做到见名识意，并且最后不要超过32个字符。<br>临时库表必须以 tmp_ 为前缀并以日期为后缀，备份表必须以 bak_ 为前缀并以日期 ( 时间戳 ) 为后缀。<br> 所有存储相同数据的列名和列类型必须一致（一般作为关联列，如果查询时关联列类型不一致会自动进行数据类型隐式转换，会造成列上的索引失效，导致查询效率降低）。<br>数据库基本设计规范</p>
<h4 id="1、所有表必须使用-InnoDB-存储引擎"><a href="#1、所有表必须使用-InnoDB-存储引擎" class="headerlink" title="1、所有表必须使用 InnoDB 存储引擎"></a>1、所有表必须使用 InnoDB 存储引擎</h4><p>没有特殊要求（即 InnoDB 无法满足的功能如：列存储，存储空间数据等）的情况下，所有表必须使用 InnoDB 存储引擎（MySQL 5.5 之前默认使用 Myisam，5.6 以后默认的为 InnoDB）InnoDB 支持事务，支持行级锁，更好的恢复性，高并发下性能更好。</p>
<h4 id="2、数据库和表的字符集统一使用-UTF8MB4"><a href="#2、数据库和表的字符集统一使用-UTF8MB4" class="headerlink" title="2、数据库和表的字符集统一使用 UTF8MB4"></a>2、数据库和表的字符集统一使用 UTF8MB4</h4><p>兼容性更好，统一字符集可以避免由于字符集转换产生的乱码，不同的字符集进行比较前需要进行转换会造成索引失效。</p>
<h4 id="3、所有表和字段都需要添加注释"><a href="#3、所有表和字段都需要添加注释" class="headerlink" title="3、所有表和字段都需要添加注释"></a>3、所有表和字段都需要添加注释</h4><p>使用 comment 从句添加表和列的备注 从一开始就进行数据字典的维护。</p>
<h4 id="4、尽量控制单表数据量的大小，建议控制在-500-万以内"><a href="#4、尽量控制单表数据量的大小，建议控制在-500-万以内" class="headerlink" title="4、尽量控制单表数据量的大小，建议控制在 500 万以内"></a>4、尽量控制单表数据量的大小，建议控制在 500 万以内</h4><p>500 万并不是 MySQL 数据库的限制，过大会造成修改表结构、备份、恢复都会有很大的问题，可以用历史数据归档（应用于日志数据），分库分表（应用于业务数据）等手段来控制数据量大小。</p>
<h4 id="5、谨慎使用-MySQL-分区表"><a href="#5、谨慎使用-MySQL-分区表" class="headerlink" title="5、谨慎使用 MySQL 分区表"></a>5、谨慎使用 MySQL 分区表</h4><p>分区表在物理上表现为多个文件，在逻辑上表现为一个表 谨慎选择分区键，跨分区查询效率可能更低 建议采用物理分表的方式管理大数据。</p>
<h4 id="6、尽量做到冷热数据分离，减小表的宽度"><a href="#6、尽量做到冷热数据分离，减小表的宽度" class="headerlink" title="6、尽量做到冷热数据分离，减小表的宽度"></a>6、尽量做到冷热数据分离，减小表的宽度</h4><p>MySQL 限制每个表最多存储 4096 列，并且每一行数据的大小不能超过 65535 字节 减少磁盘 IO，保证热数据的内存缓存命中率（表越宽，把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO） 更有效的利用缓存，避免读入无用的冷数据 经常一起使用的列放到一个表中（避免更多的关联操作）</p>
<h4 id="7、禁止在表中建立预留字段"><a href="#7、禁止在表中建立预留字段" class="headerlink" title="7、禁止在表中建立预留字段"></a>7、禁止在表中建立预留字段</h4><p>预留字段的命名很难做到见名识义 预留字段无法确认存储的数据类型，所以无法选择合适的类型 对预留字段类型的修改，会对表进行锁定</p>
<h4 id="8、禁止在数据库中存储图片，文件等大的二进制数据"><a href="#8、禁止在数据库中存储图片，文件等大的二进制数据" class="headerlink" title="8、禁止在数据库中存储图片，文件等大的二进制数据"></a>8、禁止在数据库中存储图片，文件等大的二进制数据</h4><p>通常文件很大，会短时间内造成数据量快速增长，数据库进行数据库读取时，通常会进行大量的随机 IO 操作，文件很大时，IO 操作很耗时 通常存储于文件服务器，数据库只存储文件地址信息。。</p>
<h4 id="9、禁止在线上做数据库压力测试"><a href="#9、禁止在线上做数据库压力测试" class="headerlink" title="9、禁止在线上做数据库压力测试"></a>9、禁止在线上做数据库压力测试</h4><h4 id="10、禁止从开发环境，测试环境直接连接生成环境数据库"><a href="#10、禁止从开发环境，测试环境直接连接生成环境数据库" class="headerlink" title="10、禁止从开发环境，测试环境直接连接生成环境数据库"></a>10、禁止从开发环境，测试环境直接连接生成环境数据库</h4><h3 id="数据库字段设计规范"><a href="#数据库字段设计规范" class="headerlink" title="数据库字段设计规范"></a>数据库字段设计规范</h3><h4 id="1-优先选择符合存储需要的最小的数据类型"><a href="#1-优先选择符合存储需要的最小的数据类型" class="headerlink" title="1. 优先选择符合存储需要的最小的数据类型"></a>1. 优先选择符合存储需要的最小的数据类型</h4><p>原因<br>列的字段越大，建立索引时所需要的空间也就越大，这样一页中所能存储的索引节点的数量也就越少也越少，在遍历时所需要的IO次数也就越多， 索引的性能也就越差</p>
<p>方法</p>
<h4 id="1、将字符串转换成数字类型存储，如：将IP地址转换成整形数据。"><a href="#1、将字符串转换成数字类型存储，如：将IP地址转换成整形数据。" class="headerlink" title="1、将字符串转换成数字类型存储，如：将IP地址转换成整形数据。"></a>1、将字符串转换成数字类型存储，如：将IP地址转换成整形数据。</h4><p>MySQL 提供了两个方法来处理 IP 地址</p>
<p>inet_aton 把ip转为无符号整型(4-8位)<br>inet_ntoa 把整型的ip转为地址<br>插入数据前，先用 inet_aton 把 IP 地址转为整型，可以节省空间。显示数据时，使用 inet_ntoa 把整型的 IP 地址转为地址显示即可。</p>
<h4 id="2、对于非负型的数据（如自增-ID、整型-IP）来说，要优先使用无符号整型来存储-因为无符号相对于有符号可以多出一倍的存储空间。"><a href="#2、对于非负型的数据（如自增-ID、整型-IP）来说，要优先使用无符号整型来存储-因为无符号相对于有符号可以多出一倍的存储空间。" class="headerlink" title="2、对于非负型的数据（如自增 ID、整型 IP）来说，要优先使用无符号整型来存储,因为无符号相对于有符号可以多出一倍的存储空间。"></a>2、对于非负型的数据（如自增 ID、整型 IP）来说，要优先使用无符号整型来存储,因为无符号相对于有符号可以多出一倍的存储空间。</h4><p>SIGNED INT -2147483648~2147483647<br>UNSIGNED INT 0~4294967295</p>
<p>VARCHAR(N) 中的 N 代表的是字符数，而不是字节数。使用 UTF8 存储 255 个汉字 Varchar(255)=765 个字节。过大的长度会消耗更多的内存</p>
<h4 id="2-避免使用-TEXT、BLOB-数据类型，最常见的TEXT类型可以存储64k的数据"><a href="#2-避免使用-TEXT、BLOB-数据类型，最常见的TEXT类型可以存储64k的数据" class="headerlink" title="2. 避免使用 TEXT、BLOB 数据类型，最常见的TEXT类型可以存储64k的数据"></a>2. 避免使用 TEXT、BLOB 数据类型，最常见的TEXT类型可以存储64k的数据</h4><p>建议把 BLOB 或是TEXT列分离到单独的扩展表中<br>MySQL 内存临时表不支持 TEXT、BLOB 这样的大数据类型，如果查询中包含这样的数据，在排序等操作时，就不能使用内存临时表，必须使用磁盘临时表进行。</p>
<p>而且对于这种数据，MySQL 还是要进行二次查询，会使 SQL 性能变得很差，但是不是说一定不能使用这样的数据类型。</p>
<p>如果一定要使用，建议把 BLOB 或是 TEXT 列分离到单独的扩展表中，查询时一定不要使用 select * 而只需要取出必要的列，不需要 TEXT 列的数据时不要对该列进行查询。<br>TEXT 或 BLOB 类型只能使用前缀索引<br>因为 MySQL 对索引字段长度是有限制的，所以 TEXT 类型只能使用前缀索引，并且 TEXT 列上是不能有默认值的。</p>
<h4 id="3-避免使用-ENUM-类型"><a href="#3-避免使用-ENUM-类型" class="headerlink" title="3. 避免使用 ENUM 类型"></a>3. 避免使用 ENUM 类型</h4><p>修改 ENUM 值需要使用 ALTER 语句<br>ENUM 类型的 ORDER BY 操作效率低，需要额外操作<br>禁止使用数值作为 ENUM 的枚举值</p>
<h4 id="4-尽可能把所有列定义为-NOT-NULL"><a href="#4-尽可能把所有列定义为-NOT-NULL" class="headerlink" title="4. 尽可能把所有列定义为 NOT NULL"></a>4. 尽可能把所有列定义为 NOT NULL</h4><p>原因：<br>索引 NULL 列需要额外的空间来保存，所以要占用更多的空间。<br>进行比较和计算时要对 NULL 值做特别的处理。</p>
<h4 id="5-使用-TIMESTAMP（4-个字节）或-DATETIME-类型（8-个字节）存储时间"><a href="#5-使用-TIMESTAMP（4-个字节）或-DATETIME-类型（8-个字节）存储时间" class="headerlink" title="5. 使用 TIMESTAMP（4 个字节）或 DATETIME 类型（8 个字节）存储时间"></a>5. 使用 TIMESTAMP（4 个字节）或 DATETIME 类型（8 个字节）存储时间</h4><p>TIMESTAMP 存储的时间范围 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07。</p>
<p>TIMESTAMP 占用 4 字节和 INT 相同，但比 INT 可读性高，超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储。</p>
<p>经常会有人用字符串存储日期型的数据（不正确的做法）：<br>缺点 1：无法用日期函数进行计算和比较。<br>缺点 2：用字符串存储日期要占用更多的空间。</p>
<h4 id="6-同财务相关的金额类数据必须使用-decimal-类型"><a href="#6-同财务相关的金额类数据必须使用-decimal-类型" class="headerlink" title="6. 同财务相关的金额类数据必须使用 decimal 类型"></a>6. 同财务相关的金额类数据必须使用 decimal 类型</h4><p>非精准浮点：float，double<br>精准浮点：decimal<br>Decimal 类型为精准浮点数，在计算时不会丢失精度。占用空间由定义的宽度决定，每 4 个字节可以存储 9 位数字，并且小数点要占用一个字节。可用于存储比 bigint 更大的整型数据。</p>
<h3 id="索引设计规范"><a href="#索引设计规范" class="headerlink" title="索引设计规范"></a>索引设计规范</h3><h4 id="1-限制每张表上的索引数量，建议单张表索引不超过-5-个"><a href="#1-限制每张表上的索引数量，建议单张表索引不超过-5-个" class="headerlink" title="1. 限制每张表上的索引数量，建议单张表索引不超过 5 个"></a>1. 限制每张表上的索引数量，建议单张表索引不超过 5 个</h4><p>索引并不是越多越好！索引可以提高效率同样也可以降低效率；索引可以增加查询效率，但同样也会降低插入和更新的效率，甚至有些情况下会降低查询效率。</p>
<p>因为 MySQL 优化器在选择如何优化查询时，会根据统一信息，对每一个可以用到的索引来进行评估，以生成出一个最好的执行计划，如果同时有很多个索引都可以用于查询，就会增加 MySQL 优化器生成执行计划的时间，同样会降低查询性能</p>
<h4 id="2-禁止给表中的每一列都建立单独的索引"><a href="#2-禁止给表中的每一列都建立单独的索引" class="headerlink" title="2. 禁止给表中的每一列都建立单独的索引"></a>2. 禁止给表中的每一列都建立单独的索引</h4><p>5.6 版本之前，一个 SQL 只能使用到一个表中的一个索引，5.6 以后，虽然有了合并索引的优化方式，但是还是远远没有使用一个联合索引的查询方式好</p>
<h4 id="3-每个-InnoDB-表必须有个主键"><a href="#3-每个-InnoDB-表必须有个主键" class="headerlink" title="3. 每个 InnoDB 表必须有个主键"></a>3. 每个 InnoDB 表必须有个主键</h4><p>InnoDB 是一种索引组织表：数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引，但是表的存储顺序只能有一种 InnoDB是按照主键索引的顺序来组织表的。</p>
<p>不要使用更新频繁的列作为主键，不适用多列主键（相当于联合索引） 不要使用 UUID、MD5、HASH、字符串列作为主键（无法保证数据的顺序增长）。主键建议使用自增 ID 值。<br>常见索引列建议</p>
<p>出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列。</p>
<p>包含在 ORDER BY、GROUP BY、DISTINCT 中的字段。</p>
<p>并不要将符合 1 和 2 中的字段的列都建立一个索引，通常将 1、2 中的字段建立联合索引效果更好。</p>
<p>多表 JOIN 的关联列。</p>
<p>如何选择索引列的顺序</p>
<p>建立索引的目的是：希望通过索引进行数据查找，减少随机 IO，增加查询性能 ，索引能过滤出越少的数据，则从磁盘中读入的数据也就越少。</p>
<p>区分度最高的放在联合索引的最左侧（区分度 = 列中不同值的数量 / 列的总行数）。<br>尽量把字段长度小的列放在联合索引的最左侧（因为字段长度越小，一页能存储的数据量越大，IO 性能也就越好）。<br>使用最频繁的列放到联合索引的左侧（这样可以比较少的建立一些索引）。<br>避免建立冗余索引和重复索引</p>
<p>因为这样会增加查询优化器生成执行计划的时间。</p>
<p>重复索引示例：primary key(id)、index(id)、unique index(id)</p>
<p>冗余索引示例：index(a,b,c)、index(a,b)、index(a）<br>优先考虑覆盖索引</p>
<p>对于频繁的查询优先考虑使用覆盖索引。</p>
<p>覆盖索引：就是包含了所有查询字段(where,select,ordery by,group by包含的字段)的索引</p>
<p>覆盖索引的好处：</p>
<p>避免 InnoDB 表进行索引的二次查询<br>InnoDB 是以聚集索引的顺序来存储的，对于 InnoDB 来说，二级索引在叶子节点中所保存的是行的主键信息，如果是用二级索引查询数据的话，在查找到相应的键值后，还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中，二级索引的键值中可以获取所有的数据，避免了对主键的二次查询 ，减少了 IO 操作，提升了查询效率。</p>
<p>可以把随机 IO 变成顺序 IO 加快查询效率<br>由于覆盖索引是按键值的顺序存储的，对于 IO 密集型的范围查找来说，对比随机从磁盘读取每一行的数据 IO 要少的多，因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。<br>索引SET规范</p>
<p>尽量避免使用外键约束。</p>
<p>不建议使用外键约束（foreign key），但一定要在表与表之间的关联键上建立索引。</p>
<p>外键可用于保证数据的参照完整性，但建议在业务端实现。</p>
<p>外键会影响父表和子表的写操作从而降低性能。</p>
<h3 id="数据库SQL开发规范"><a href="#数据库SQL开发规范" class="headerlink" title="数据库SQL开发规范"></a>数据库SQL开发规范</h3><h4 id="1-建议使用预编译语句进行数据库操作"><a href="#1-建议使用预编译语句进行数据库操作" class="headerlink" title="1. 建议使用预编译语句进行数据库操作"></a>1. 建议使用预编译语句进行数据库操作</h4><p>预编译语句可以重复使用这些计划，减少 SQL 编译所需要的时间，还可以解决动态 SQL 所带来的 SQL 注入的问题 只传参数，比传递 SQL 语句更高效 相同语句可以一次解析，多次使用，提高处理效率。</p>
<h4 id="2-避免数据类型的隐式转换"><a href="#2-避免数据类型的隐式转换" class="headerlink" title="2. 避免数据类型的隐式转换"></a>2. 避免数据类型的隐式转换</h4><p>隐式转换会导致索引失效。如：<br>select name,phone from customer where id = ‘111’;</p>
<h4 id="3-充分利用表上已经存在的索引"><a href="#3-充分利用表上已经存在的索引" class="headerlink" title="3. 充分利用表上已经存在的索引"></a>3. 充分利用表上已经存在的索引</h4><p>避免使用双 % 号的查询条件。<br>如a like ‘%123%’，（如果无前置 %，只有后置 %，是可以用到列上的索引的）</p>
<p>一个 SQL 只能利用到复合索引中的一列进行范围查询<br>如：有 a,b,c 列的联合索引，在查询条件中有 a 列的范围查询，则在 b,c 列上的索引将不会被用到，在定义联合索引时，如果a列要用到范围查找的话，就要把 a 列放到联合索引的右侧。</p>
<p>使用 left join 或 not exists 来优化 not in 操作<br>因为 not in 也通常会使用索引失效。</p>
<h4 id="4-数据库设计时，应该要对以后扩展进行考虑"><a href="#4-数据库设计时，应该要对以后扩展进行考虑" class="headerlink" title="4. 数据库设计时，应该要对以后扩展进行考虑"></a>4. 数据库设计时，应该要对以后扩展进行考虑</h4><h4 id="5-程序连接不同的数据库使用不同的账号，进制跨库查询"><a href="#5-程序连接不同的数据库使用不同的账号，进制跨库查询" class="headerlink" title="5. 程序连接不同的数据库使用不同的账号，进制跨库查询"></a>5. 程序连接不同的数据库使用不同的账号，进制跨库查询</h4><p>为数据库迁移和分库分表留出余地<br>降低业务耦合度<br>避免权限过大而产生的安全风险</p>
<h4 id="6-禁止使用-SELECT-必须使用-SELECT-lt-字段列表-gt-查询"><a href="#6-禁止使用-SELECT-必须使用-SELECT-lt-字段列表-gt-查询" class="headerlink" title="6. 禁止使用 SELECT * 必须使用 SELECT &lt;字段列表&gt; 查询"></a>6. 禁止使用 SELECT * 必须使用 SELECT &lt;字段列表&gt; 查询</h4><p>消耗更多的 CPU 和 IO 以网络带宽资源<br>无法使用覆盖索引<br>可减少表结构变更带来的影响</p>
<h4 id="7-禁止使用不含字段列表的-INSERT-语句"><a href="#7-禁止使用不含字段列表的-INSERT-语句" class="headerlink" title="7. 禁止使用不含字段列表的 INSERT 语句"></a>7. 禁止使用不含字段列表的 INSERT 语句</h4><p>如：<br>insert into values (‘a’,’b’,’c’); </p>
<p>应使用：<br>insert into t(c1,c2,c3) values (‘a’,’b’,’c’);</p>
<h4 id="8-避免使用子查询，可以把子查询优化为-JOIN-操作"><a href="#8-避免使用子查询，可以把子查询优化为-JOIN-操作" class="headerlink" title="8. 避免使用子查询，可以把子查询优化为 JOIN 操作"></a>8. 避免使用子查询，可以把子查询优化为 JOIN 操作</h4><p>通常子查询在 in 子句中，且子查询中为简单 SQL ( 不包含 union、group by、order by、limit 从句 ) 时，才可以把子查询转化为关联查询进行优化。<br>子查询性能差的原因：<br>子查询的结果集无法使用索引，通常子查询的结果集会被存储到临时表中，不论是内存临时表还是磁盘临时表都不会存在索引，所以查询性能会受到一定的影响。<br>特别是对于返回结果集比较大的子查询，其对查询性能的影响也就越大。<br>由于子查询会产生大量的临时表也没有索引，所以会消耗过多的 CPU 和 IO 资源，产生大量的慢查询。</p>
<h4 id="9-避免使用-JOIN-关联太多的表"><a href="#9-避免使用-JOIN-关联太多的表" class="headerlink" title="9. 避免使用 JOIN 关联太多的表"></a>9. 避免使用 JOIN 关联太多的表</h4><p>对于 MySQL 来说，是存在关联缓存的，缓存的大小可以由 join_buffer_size 参数进行设置。</p>
<p>在 MySQL 中，对于同一个 SQL 多关联（join）一个表，就会多分配一个关联缓存，如果在一个 SQL 中关联的表越多，所占用的内存也就越大。</p>
<p>如果程序中大量的使用了多表关联的操作，同时 join_buffer_size 设置的也不合理的情况下，就容易造成服务器内存溢出的情况，就会影响到服务器数据库性能的稳定性。</p>
<p>同时对于关联操作来说，会产生临时表操作，影响查询效率 MySQL 最多允许关联 61 个表，建议不超过 5 个。</p>
<h4 id="10-减少同数据库的交互次数"><a href="#10-减少同数据库的交互次数" class="headerlink" title="10. 减少同数据库的交互次数"></a>10. 减少同数据库的交互次数</h4><p>数据库更适合处理批量操作 合并多个相同的操作到一起，可以提高处理效率</p>
<h4 id="11-对应同一列进行-or-判断时，使用-in-代替-or"><a href="#11-对应同一列进行-or-判断时，使用-in-代替-or" class="headerlink" title="11. 对应同一列进行 or 判断时，使用 in 代替 or"></a>11. 对应同一列进行 or 判断时，使用 in 代替 or</h4><p>In 的值不要超过 500 个， in 操作可以更有效的利用索引，or 大多数情况下很少能利用到索引。</p>
<h4 id="12-禁止使用-order-by-rand-进行随机排序"><a href="#12-禁止使用-order-by-rand-进行随机排序" class="headerlink" title="12. 禁止使用 order by rand() 进行随机排序"></a>12. 禁止使用 order by rand() 进行随机排序</h4><p>会把表中所有符合条件的数据装载到内存中，然后在内存中对所有数据根据随机生成的值进行排序，并且可能会对每一行都生成一个随机值，如果满足条件的数据集非常大，就会消耗大量的 CPU 和 IO 及内存资源。</p>
<p>推荐在程序中获取一个随机值，然后从数据库中获取数据的方式。</p>
<h4 id="13-WHERE从句中禁止对列进行函数转换和计算"><a href="#13-WHERE从句中禁止对列进行函数转换和计算" class="headerlink" title="13. WHERE从句中禁止对列进行函数转换和计算"></a>13. WHERE从句中禁止对列进行函数转换和计算</h4><p>对列进行函数转换或计算时会导致无法使用索引。<br>不推荐：<br>where date(create_time)=’20190101’</p>
<p>推荐：<br>where create_time &gt;= ‘20190101’ and create_time &lt; ‘20190102’</p>
<h4 id="14-在明显不会有重复值时使用-UNION-ALL-而不是-UNION"><a href="#14-在明显不会有重复值时使用-UNION-ALL-而不是-UNION" class="headerlink" title="14. 在明显不会有重复值时使用 UNION ALL 而不是 UNION"></a>14. 在明显不会有重复值时使用 UNION ALL 而不是 UNION</h4><p>UNION 会把两个结果集的所有数据放到临时表中后再进行去重操作。<br>UNION ALL 不会再对结果集进行去重操作。</p>
<h4 id="15-拆分复杂的大-SQL-为多个小-SQL"><a href="#15-拆分复杂的大-SQL-为多个小-SQL" class="headerlink" title="15. 拆分复杂的大 SQL 为多个小 SQL"></a>15. 拆分复杂的大 SQL 为多个小 SQL</h4><p>大 SQL：逻辑上比较复杂，需要占用大量 CPU 进行计算的SQL 。<br>MySQL：一个 SQL 只能使用一个 CPU 进行计算。<br>SQL 拆分后可以通过并行执行来提高处理效率。</p>
<h3 id="大limit"><a href="#大limit" class="headerlink" title="大limit"></a>大limit</h3><p>SELECT <em> FROM table ORDER BY TIME DESC LIMIT 10000,10;<br>这种分页方式会导致大量的 io，因为 MySQL 使用的是提前读取策略。<br>推荐分页方式：<br>SELECT </em> FROM table WHERE TIME&lt;last_TIME ORDER BY TIME DESC LIMIT 10.<br>SELECT * FROM table inner JOIN(SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t USING(id)</p>
<h3 id="数据库操作行为规范"><a href="#数据库操作行为规范" class="headerlink" title="数据库操作行为规范"></a>数据库操作行为规范</h3><h4 id="1-超-100-万行的批量写（UPDATE、DELETE、INSERT）操作，要分批多次进行操作"><a href="#1-超-100-万行的批量写（UPDATE、DELETE、INSERT）操作，要分批多次进行操作" class="headerlink" title="1. 超 100 万行的批量写（UPDATE、DELETE、INSERT）操作，要分批多次进行操作"></a>1. 超 100 万行的批量写（UPDATE、DELETE、INSERT）操作，要分批多次进行操作</h4><p>大批量操作可能会造成严重的主从延迟<br>主从环境中，大批量操作可能会造成严重的主从延迟，大批量的写操作一般都需要执行一定长的时间，而只有当主库上执行完成后，才会在其他从库上执行，所以会造成主库与从库长时间的延迟情况<br>Binlog 日志为 row 格式时会产生大量的日志<br>大批量写操作会产生大量日志，特别是对于 row 格式二进制数据而言，由于在 row 格式中会记录每一行数据的修改，我们一次修改的数据越多，产生的日志量也就会越多，日志的传输和恢复所需要的时间也就越长，这也是造成主从延迟的一个原因。<br>避免产生大事务操作<br>大批量修改数据，一定是在一个事务中进行的，这就会造成表中大批量数据进行锁定，从而导致大量的阻塞，阻塞会对 MySQL 的性能产生非常大的影响。<br>特别是长时间的阻塞会占满所有数据库的可用连接，这会使生产环境中的其他应用无法连接到数据库，因此一定要注意大批量写操作要进行分批。</p>
<h4 id="2-对于大表使用-pt-online-schema-change-修改表结构"><a href="#2-对于大表使用-pt-online-schema-change-修改表结构" class="headerlink" title="2. 对于大表使用 pt-online-schema-change 修改表结构"></a>2. 对于大表使用 pt-online-schema-change 修改表结构</h4><p>避免大表修改产生的主从延迟<br>避免在对表字段进行修改时进行锁表<br>对大表数据结构的修改一定要谨慎，会造成严重的锁表操作，尤其是生产环境，是不能容忍的。</p>
<p>pt-online-schema-change 它会首先建立一个与原表结构相同的新表，并且在新表上进行表结构的修改，然后再把原表中的数据复制到新表中，并在原表中增加一些触发器。</p>
<p>把原表中新增的数据也复制到新表中，在行所有数据复制完成之后，把新表命名成原表，并把原来的表删除掉,把原来一个 DDL 操作，分解成多个小的批次进行。</p>
<h4 id="3-禁止为程序使用的账号赋予-super-权限"><a href="#3-禁止为程序使用的账号赋予-super-权限" class="headerlink" title="3. 禁止为程序使用的账号赋予 super 权限"></a>3. 禁止为程序使用的账号赋予 super 权限</h4><p>当达到最大连接数限制时，还运行 1个 有 super 权限的用户连接 super 权限只能留给 DBA 处理问题的账号使用。</p>
<h4 id="4-对于程序连接数据库账号，遵循权限最小原则"><a href="#4-对于程序连接数据库账号，遵循权限最小原则" class="headerlink" title="4. 对于程序连接数据库账号，遵循权限最小原则"></a>4. 对于程序连接数据库账号，遵循权限最小原则</h4><p>程序使用数据库账号只能在一个 DB 下使用，不准跨库 程序使用的账号原则上不准有 drop 权限。</p>
<h3 id="修改表的默认字符集不会改表各个字段的字符集"><a href="#修改表的默认字符集不会改表各个字段的字符集" class="headerlink" title="修改表的默认字符集不会改表各个字段的字符集"></a>修改表的默认字符集不会改表各个字段的字符集</h3><p>很多初学者会将 ALTER TABLE tbl_name [DEFAULT] CHARACTER SET ‘UTF8’ 误认为会修改所有字段的字符集，但实际上它只会影响后续新增的字段不会改表已有字段的字符集。<br>如果想修改整张表所有字段的字符集建议使用 ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;</p>
<h3 id="多条-ALTER-请求建议合为一条"><a href="#多条-ALTER-请求建议合为一条" class="headerlink" title="多条 ALTER 请求建议合为一条"></a>多条 ALTER 请求建议合为一条</h3><p>ALTER TABLE tbl ADD COLUMN col int, ADD INDEX idx_col (<code>col</code>);</p>
<p><a href="https://dev.mysql.com/doc/employee/en/employees-installation.html" target="_blank" rel="noopener">MySQL测试数据</a></p>
<p><a href="https://blog.csdn.net/zytbft/article/details/84504348" target="_blank" rel="noopener"> SQL语句在线练习</a></p>
<p><a href="http://sqlfiddle.com/#!9" target="_blank" rel="noopener">MySQL在线测试</a></p>
<p><a href="https://github.com/XiaoMi/soar/blob/master/doc/heuristic.md" target="_blank" rel="noopener">MySQL 避坑宝典</a></p>
<p><a href="https://learnku.com/articles/25224" target="_blank" rel="noopener">面试之 Memcache 相关</a></p>
<p><a href="https://mp.weixin.qq.com/s/Tgi52hQj8ANerZIF8h_zgA" target="_blank" rel="noopener">一份非常完整的 MySQL 规范</a></p>
<p><a href="https://learnku.com/articles/25148#topnav" target="_blank" rel="noopener">MySQL 社区规范 | 数据库篇</a></p>
<p><a href="https://learnku.com/articles/25116#topnav" target="_blank" rel="noopener">MySQL 规范 (数据库表设计规范)</a></p>
<p><a href="https://learnku.com/articles/25020#topnav" target="_blank" rel="noopener">MySQL 规范</a></p>
<p><a href="http://cw.hubwiz.com/card/c/543b2f3cf86387171814c026/1/1/5/" target="_blank" rel="noopener">MongoDB教程</a></p>
<p><a href="https://github.com/StevenSLXie/Tutorials-for-Web-Developers/blob/master/MongoDB%20%E6%9E%81%E7%AE%80%E5%AE%9E%E8%B7%B5%E5%85%A5%E9%97%A8.md" target="_blank" rel="noopener">MongoDB 极简实践入门</a></p>
<p><a href="http://fanqieto.top/2017/11/23/mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%BB%93%E6%9E%84%E4%BC%98%E5%8C%96/" target="_blank" rel="noopener">mysql数据库结构优化</a></p>
<p><a href="https://learnku.com/articles/18784#topnav" target="_blank" rel="noopener">MySQL 配置读写分离</a></p>
<p><a href="https://learnku.com/articles/27641" target="_blank" rel="noopener">MySQL 细致总结之中级篇</a></p>
<p><a href="https://learnku.com/articles/26434#topnav" target="_blank" rel="noopener">数据库并发如何让数据操作串行化</a></p>
<p><a href="https://segmentfault.com/a/1190000019284665" target="_blank" rel="noopener">去 BAT 面试，总结了这 55 道 MySQL 面试题！</a></p>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/mysql/" rel="tag"># mysql</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2019/03/01/那些黑科技/" rel="next" title="那些黑科技">
                <i class="fa fa-chevron-left"></i> 那些黑科技
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2019/03/18/golang-学习笔记/" rel="prev" title="golang 学习笔记">
                golang 学习笔记 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  
          <div class="comments" id="comments">
             <div id="gitment-container"></div>
         </div>
  




        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">苏生不惑</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives/">
              
                  <span class="site-state-item-count">382</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            

            
              
              
              <div class="site-state-item site-state-tags">
                <a href="/tags/index.html">
                  <span class="site-state-item-count">37</span>
                  <span class="site-state-item-name">标签</span>
                </a>
              </div>
            

          </nav>

          

          
            <div class="links-of-author motion-element">
                
                  <span class="links-of-author-item">
                    <a href="https://github.com/sushengbuhuo" target="_blank" title="GitHub">
                      
                        <i class="fa fa-fw fa-github"></i>GitHub</a>
                  </span>
                
                  <span class="links-of-author-item">
                    <a href="mysusheng@gmail.com" target="_blank" title="E-Mail">
                      
                        <i class="fa fa-fw fa-envelope"></i>E-Mail</a>
                  </span>
                
                  <span class="links-of-author-item">
                    <a href="https://plus.google.com/mysusheng" target="_blank" title="Google">
                      
                        <i class="fa fa-fw fa-google"></i>Google</a>
                  </span>
                
            </div>
          

          
          

          
          
            <div class="links-of-blogroll motion-element links-of-blogroll-block">
              <div class="links-of-blogroll-title">
                <i class="fa  fa-fw fa-link"></i>
                Links
              </div>
              <ul class="links-of-blogroll-list">
                
                  <li class="links-of-blogroll-item">
                    <a href="http://v2ex.com/" title="v2ex" target="_blank">v2ex</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.fanhaobai.com/" title="fanhaobai" target="_blank">fanhaobai</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://yuanxuxu.com/archives/" title="yuanxuxu" target="_blank">yuanxuxu</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.snail-c.cn/article" title="snail-c" target="_blank">snail-c</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="http://showcj.com/archives" title="showcj" target="_blank">showcj</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="http://vultr.aicnm.com/%E6%9C%80%E6%96%B0Vultr%E6%B3%A8%E5%86%8C%E5%8F%8AVPS%E8%B4%AD%E4%B9%B0%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B/" title="vultr" target="_blank">vultr</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.lucissfer.com/" title="lucissfer" target="_blank">lucissfer</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://blog.csdn.net/fdipzone/article/details/79352685" title="傲雪星枫" target="_blank">傲雪星枫</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.yoby123.cn/index.php/category/default/" title="小白的分享" target="_blank">小白的分享</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.cnblogs.com/52fhy/p/5819995.html" title="PHP攻城狮" target="_blank">PHP攻城狮</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://blog.jiaojie.site/" title="php" target="_blank">php</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://sphard.com/archives/" title="sphard" target="_blank">sphard</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://yuanxuxu.com/archives/" title="LNMP技术栈笔记" target="_blank">LNMP技术栈笔记</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="http://www.coding10.com/" title="学习 Laravel" target="_blank">学习 Laravel</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://shuwoom.com/?page_id=929" title="区块链学习指南" target="_blank">区块链学习指南</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://greenlightt.github.io/archives/" title="greenlightt" target="_blank">greenlightt</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.0php.net/archives/" title="0php" target="_blank">0php</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="http://www.fordba.com/category/mysql" title="mysql" target="_blank">mysql</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.itcodemonkey.com/" title="程序员" target="_blank">程序员</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.yanshuo.me/r/v2ex" title="言说" target="_blank">言说</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.timiguo.com/archive.html" title="提米果的博客" target="_blank">提米果的博客</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://phpartisan.cn/news/112.html" title="phpartisan" target="_blank">phpartisan</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.cnblogs.com/52fhy/" title="飞鸿影" target="_blank">飞鸿影</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="http://www.54php.cn/" title="54php" target="_blank">54php</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.lazyman.vip/" title="营销" target="_blank">营销</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.njphper.com/archives/" title="做人呢最重要的就是开心" target="_blank">做人呢最重要的就是开心</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="https://www.h57.pw/" title="php 初心者" target="_blank">php 初心者</a>
                  </li>
                
              </ul>
            </div>
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#数据命名规范"><span class="nav-number">1.</span> <span class="nav-text">数据命名规范</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#1、所有表必须使用-InnoDB-存储引擎"><span class="nav-number">1.1.</span> <span class="nav-text">1、所有表必须使用 InnoDB 存储引擎</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#2、数据库和表的字符集统一使用-UTF8MB4"><span class="nav-number">1.2.</span> <span class="nav-text">2、数据库和表的字符集统一使用 UTF8MB4</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#3、所有表和字段都需要添加注释"><span class="nav-number">1.3.</span> <span class="nav-text">3、所有表和字段都需要添加注释</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4、尽量控制单表数据量的大小，建议控制在-500-万以内"><span class="nav-number">1.4.</span> <span class="nav-text">4、尽量控制单表数据量的大小，建议控制在 500 万以内</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#5、谨慎使用-MySQL-分区表"><span class="nav-number">1.5.</span> <span class="nav-text">5、谨慎使用 MySQL 分区表</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#6、尽量做到冷热数据分离，减小表的宽度"><span class="nav-number">1.6.</span> <span class="nav-text">6、尽量做到冷热数据分离，减小表的宽度</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#7、禁止在表中建立预留字段"><span class="nav-number">1.7.</span> <span class="nav-text">7、禁止在表中建立预留字段</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#8、禁止在数据库中存储图片，文件等大的二进制数据"><span class="nav-number">1.8.</span> <span class="nav-text">8、禁止在数据库中存储图片，文件等大的二进制数据</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#9、禁止在线上做数据库压力测试"><span class="nav-number">1.9.</span> <span class="nav-text">9、禁止在线上做数据库压力测试</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#10、禁止从开发环境，测试环境直接连接生成环境数据库"><span class="nav-number">1.10.</span> <span class="nav-text">10、禁止从开发环境，测试环境直接连接生成环境数据库</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#数据库字段设计规范"><span class="nav-number">2.</span> <span class="nav-text">数据库字段设计规范</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#1-优先选择符合存储需要的最小的数据类型"><span class="nav-number">2.1.</span> <span class="nav-text">1. 优先选择符合存储需要的最小的数据类型</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#1、将字符串转换成数字类型存储，如：将IP地址转换成整形数据。"><span class="nav-number">2.2.</span> <span class="nav-text">1、将字符串转换成数字类型存储，如：将IP地址转换成整形数据。</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#2、对于非负型的数据（如自增-ID、整型-IP）来说，要优先使用无符号整型来存储-因为无符号相对于有符号可以多出一倍的存储空间。"><span class="nav-number">2.3.</span> <span class="nav-text">2、对于非负型的数据（如自增 ID、整型 IP）来说，要优先使用无符号整型来存储,因为无符号相对于有符号可以多出一倍的存储空间。</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#2-避免使用-TEXT、BLOB-数据类型，最常见的TEXT类型可以存储64k的数据"><span class="nav-number">2.4.</span> <span class="nav-text">2. 避免使用 TEXT、BLOB 数据类型，最常见的TEXT类型可以存储64k的数据</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#3-避免使用-ENUM-类型"><span class="nav-number">2.5.</span> <span class="nav-text">3. 避免使用 ENUM 类型</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4-尽可能把所有列定义为-NOT-NULL"><span class="nav-number">2.6.</span> <span class="nav-text">4. 尽可能把所有列定义为 NOT NULL</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#5-使用-TIMESTAMP（4-个字节）或-DATETIME-类型（8-个字节）存储时间"><span class="nav-number">2.7.</span> <span class="nav-text">5. 使用 TIMESTAMP（4 个字节）或 DATETIME 类型（8 个字节）存储时间</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#6-同财务相关的金额类数据必须使用-decimal-类型"><span class="nav-number">2.8.</span> <span class="nav-text">6. 同财务相关的金额类数据必须使用 decimal 类型</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#索引设计规范"><span class="nav-number">3.</span> <span class="nav-text">索引设计规范</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#1-限制每张表上的索引数量，建议单张表索引不超过-5-个"><span class="nav-number">3.1.</span> <span class="nav-text">1. 限制每张表上的索引数量，建议单张表索引不超过 5 个</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#2-禁止给表中的每一列都建立单独的索引"><span class="nav-number">3.2.</span> <span class="nav-text">2. 禁止给表中的每一列都建立单独的索引</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#3-每个-InnoDB-表必须有个主键"><span class="nav-number">3.3.</span> <span class="nav-text">3. 每个 InnoDB 表必须有个主键</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#数据库SQL开发规范"><span class="nav-number">4.</span> <span class="nav-text">数据库SQL开发规范</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#1-建议使用预编译语句进行数据库操作"><span class="nav-number">4.1.</span> <span class="nav-text">1. 建议使用预编译语句进行数据库操作</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#2-避免数据类型的隐式转换"><span class="nav-number">4.2.</span> <span class="nav-text">2. 避免数据类型的隐式转换</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#3-充分利用表上已经存在的索引"><span class="nav-number">4.3.</span> <span class="nav-text">3. 充分利用表上已经存在的索引</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4-数据库设计时，应该要对以后扩展进行考虑"><span class="nav-number">4.4.</span> <span class="nav-text">4. 数据库设计时，应该要对以后扩展进行考虑</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#5-程序连接不同的数据库使用不同的账号，进制跨库查询"><span class="nav-number">4.5.</span> <span class="nav-text">5. 程序连接不同的数据库使用不同的账号，进制跨库查询</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#6-禁止使用-SELECT-必须使用-SELECT-lt-字段列表-gt-查询"><span class="nav-number">4.6.</span> <span class="nav-text">6. 禁止使用 SELECT * 必须使用 SELECT &lt;字段列表&gt; 查询</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#7-禁止使用不含字段列表的-INSERT-语句"><span class="nav-number">4.7.</span> <span class="nav-text">7. 禁止使用不含字段列表的 INSERT 语句</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#8-避免使用子查询，可以把子查询优化为-JOIN-操作"><span class="nav-number">4.8.</span> <span class="nav-text">8. 避免使用子查询，可以把子查询优化为 JOIN 操作</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#9-避免使用-JOIN-关联太多的表"><span class="nav-number">4.9.</span> <span class="nav-text">9. 避免使用 JOIN 关联太多的表</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#10-减少同数据库的交互次数"><span class="nav-number">4.10.</span> <span class="nav-text">10. 减少同数据库的交互次数</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#11-对应同一列进行-or-判断时，使用-in-代替-or"><span class="nav-number">4.11.</span> <span class="nav-text">11. 对应同一列进行 or 判断时，使用 in 代替 or</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#12-禁止使用-order-by-rand-进行随机排序"><span class="nav-number">4.12.</span> <span class="nav-text">12. 禁止使用 order by rand() 进行随机排序</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#13-WHERE从句中禁止对列进行函数转换和计算"><span class="nav-number">4.13.</span> <span class="nav-text">13. WHERE从句中禁止对列进行函数转换和计算</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#14-在明显不会有重复值时使用-UNION-ALL-而不是-UNION"><span class="nav-number">4.14.</span> <span class="nav-text">14. 在明显不会有重复值时使用 UNION ALL 而不是 UNION</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#15-拆分复杂的大-SQL-为多个小-SQL"><span class="nav-number">4.15.</span> <span class="nav-text">15. 拆分复杂的大 SQL 为多个小 SQL</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#大limit"><span class="nav-number">5.</span> <span class="nav-text">大limit</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#数据库操作行为规范"><span class="nav-number">6.</span> <span class="nav-text">数据库操作行为规范</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#1-超-100-万行的批量写（UPDATE、DELETE、INSERT）操作，要分批多次进行操作"><span class="nav-number">6.1.</span> <span class="nav-text">1. 超 100 万行的批量写（UPDATE、DELETE、INSERT）操作，要分批多次进行操作</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#2-对于大表使用-pt-online-schema-change-修改表结构"><span class="nav-number">6.2.</span> <span class="nav-text">2. 对于大表使用 pt-online-schema-change 修改表结构</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#3-禁止为程序使用的账号赋予-super-权限"><span class="nav-number">6.3.</span> <span class="nav-text">3. 禁止为程序使用的账号赋予 super 权限</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#4-对于程序连接数据库账号，遵循权限最小原则"><span class="nav-number">6.4.</span> <span class="nav-text">4. 对于程序连接数据库账号，遵循权限最小原则</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#修改表的默认字符集不会改表各个字段的字符集"><span class="nav-number">7.</span> <span class="nav-text">修改表的默认字符集不会改表各个字段的字符集</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#多条-ALTER-请求建议合为一条"><span class="nav-number">8.</span> <span class="nav-text">多条 ALTER 请求建议合为一条</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

<div class="copyright">&copy; <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">苏生不惑</span>

  
</div>


  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Gemini</a> v5.1.4</div>



<div>
<span id="showDays"></span>

</div>

<span id="busuanzi_container_site_pv">
   总访问量:<span id="busuanzi_value_site_pv"></span>次
</span>



  <span class="post-meta-divider">|</span>



<div class="theme-info">
  <div class="powered-by"></div>
  <span class="post-count">博客全站共773.8k字</span>
</div>
<script>
var birthDay = new Date("11/20/2018");
var now = new Date();
var duration = now.getTime() - birthDay.getTime();
var total= Math.floor(duration / (1000 * 60 * 60 * 24));
document.getElementById("showDays").innerHTML = "本站已运行 "+total+" 天";
</script>

        
<div class="busuanzi-count">
  <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  
    <span class="site-uv">
      <i class="fa fa-user"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
      人次
    </span>
  

  
    <span class="site-pv">
      <i class="fa fa-eye"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
      次
    </span>
  
</div>








        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  


  











  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  

  
  
    <script type="text/javascript" src="/lib/canvas-nest/canvas-nest.min.js"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.4"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  











<script type="text/javascript">
    (function() {
        // 匿名函数，防止污染全局变量
        var utterances = document.createElement('script');
        utterances.type = 'text/javascript';
        utterances.async = true;
        utterances.setAttribute('issue-term','0')
        utterances.setAttribute('theme','')
        utterances.setAttribute('repo','sushengbuhuo/laravel_ioc_demo')
        utterances.crossorigin = 'anonymous';
        utterances.src = 'https://utteranc.es/client.js';
        // content 是要插入评论的地方
        document.getElementById('gitment-container').appendChild(utterances);
    })();
</script>


  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'auto') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  

  
  

  

  

  

  
<script>
  ((window.gitter = {}).chat = {}).options = {
    //room替换成自己的聊天室名称即可，room的名称规则是：username/roomname
    room: 'sushengbuhuo-chat/mychat'
  };
</script>
<script src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer></script>

</body>
</html>
